{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 频率主义 vs 贝叶斯主义 II：当结果不同时"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*这个notebook出自[Pythonic Perambulations](http://jakevdp.github.io)的[博文](http://jakevdp.github.io/blog/2014/06/06/frequentism-and-bayesianism-2-when-results-differ/) . The content is BSD licensed.*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*这个系列共4个部分：中文版[Part I](http://muxuezi.github.io/posts/frequentism-and-bayesianism-chs)  [Part II](http://muxuezi.github.io/posts/frequentism-and-bayesianism-chs-ii)  [Part III](http://muxuezi.github.io/posts/frequentism-and-bayesianism-chs-iii)  [Part IV](http://muxuezi.github.io/posts/frequentism-and-bayesianism-chs-iv)，英文版[Part I](http://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/)  [Part II](http://jakevdp.github.io/blog/2014/06/06/frequentism-and-bayesianism-2-when-results-differ/)  [Part III](http://jakevdp.github.io/blog/2014/06/12/frequentism-and-bayesianism-3-confidence-credibility/)  [Part IV](http://jakevdp.github.io/blog/2014/06/14/frequentism-and-bayesianism-4-bayesian-in-python/)*\n",
    "\n",
    "<!-- TEASER_END -->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在[上一篇](http://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/)我论述了频率主义和贝叶斯主义在科学计算方面的差异。其中，讨论了两者基础理论的差异，表明在简单问题的处理方面两者基本等价。\n",
    "\n",
    "尽管如此，在处理复杂问题时两者会有巨大分歧。通过我的实践表明，这种分歧主要出现在两个方面：\n",
    "\n",
    "1. 冗余参数(nuisance parameters)的处理\n",
    "2. 频率论的置信区间(confidence intervals)和贝叶斯可信区间(credible intervals)的小差异(经常被忽略)。\n",
    "\n",
    "第二点有点复杂，我打算后面再讲，这篇内容先讲第一点：冗余参数的差异。尽管我会尽力保持公正，但你还是会觉得我偏向贝叶斯方法。不过，这些都只是解决第二点之前的热身赛，因为那会引起更多口水战(get downright polemical)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 什么是冗余参数？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "冗余参数是与最终目标无关的任何变量，但是对确定一些相关的变量却不可或缺。例如，在上一篇博文的 [第二个案例](http://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/#Varying-Photon-Counts:-The-Bayesian-Approach) 中，我们估计了光量子的均值$\\mu$和标准差$\\sigma$。而我们真正感兴趣的是$\\mu$，就是分布的均值。那么，$\\sigma$就是冗余参数，它与最终结果无关，但是它是确定目标$\\mu$的过河石头，不可或缺。\n",
    "\n",
    "我打算用两个例子来论述冗余参数。下面我们看看频率主义和贝叶斯主义解决这些问题差异："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 例 #1：贝叶斯台球(The Bayesian Billiard Game)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我打算从Thomas Bayes[1763的论文](http://www.stat.ucla.edu/history/essay.pdf) 里介绍的游戏出发来讨论冗余参数。这里我选一种改进版，详细介绍在[Eddy 2004](ftp://selab.janelia.org/pub/publications/Eddy-ATG3/Eddy-ATG3-reprint.pdf)里面。\n",
    "\n",
    "背景是两个人Alice和Bob赌输赢，但是他们看不到游戏的过程：\n",
    "\n",
    "在一个房间里Alice和Bob前面挂着帘子，后面是个台球桌，他们看不到。但是他们的朋友Carol可以，Carol掷出一个球，然后记下球的位置。之后，他继续掷，如果这个球在第一个球的左边，Alice得一分。否则Bob得一分。这里假设Carol是公正无私的：也就是说他掷出的球呈均匀分布。先得**6分**者胜，也就是11局6胜。\n",
    "\n",
    "第一个球的位置就是一个冗余参数：它是不确定的，也非结果，但是很明显后面的球都受其影响。如果这个球很靠右，那么Alice就占便宜。否则这个球很靠左，那么Bob就占便宜。\n",
    "\n",
    "那么我的问题是：\n",
    "\n",
    ">在某次游戏中，当Alice赢5分时Bob才赢3分，那么Bob最后获胜的概率多大？\n",
    "\n",
    "乍一看8个球里面Alice赢了5个球，标记位置可能更偏向她。那么，后面的球也更可能偏向她。而且她只要得一个球赢了，比Bob多3个机会；看来她是赢定了。但是**定量分析**Bob赢的概率是多少呢？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 简单频率论方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "持频率方法论的人可能会如此解释：\n",
    "\n",
    "要想获得结果，我们得先间接的估计一下标记的位置，假设概率$p$，可以表示为Alice的得分在掷过的球的结果中的比例。因为8个球里面Alice得5分，则$p$的最大似然估计(maximum likelihood estimate)为：\n",
    "\n",
    "$$\\hat{p} = 5/8$$\n",
    "\n",
    "(结果服从二项分布的最大似然估计[binomial likelihood](http://en.wikipedia.org/wiki/Binomial_distribution))。假设Bob获胜的最大似然估计为$P(B)$，则：\n",
    "\n",
    "$$P(B) = (1 - \\hat{p})^3$$\n",
    "\n",
    "也就是说，Bob要连续赢3次。我们可以算出结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Bob获胜的频率论概率为: 0.05\n"
     ]
    }
   ],
   "source": [
    "p_hat = 5. / 8.\n",
    "freq_prob = (1 - p_hat) ** 3\n",
    "print(u\"Bob获胜的频率论概率为: {0:.2f}\".format(freq_prob))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们改为赔率(odds)的方式显示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Bob获胜的赔率为: 18 to 1\n"
     ]
    }
   ],
   "source": [
    "print(u\"Bob获胜的赔率为: {0:.0f} to 1\".format((1. - freq_prob) / freq_prob))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见，Bob每赢一次，Alice要赢18次。让我们再试试贝叶斯方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 贝叶斯方法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们再从贝叶斯的角度看看这个问题。有点小复杂，得先定义一些变量：\n",
    "\n",
    "具体定义如下：\n",
    "\n",
    "- $B$ = Bob获胜\n",
    "- $D$ = 样本数据，如$D = (n_A, n_B) = (5, 3)$\n",
    "- $p$ = 球落在Alice那边的概率\n",
    "\n",
    "我们要计算$P(B~|~D)$，即在Alice与Bob比分$5:3$的条件下，Bob获胜的概率。\n",
    "\n",
    "通常，贝叶斯方法处理冗余参数的方法是*边缘概率法(marginalization)*，即获得冗余参数全部可能的联合概率分布(joint probability)。也就是说，我们得先计算联合概率分布\n",
    "\n",
    "$$P(B,p~|~D)$$\n",
    "\n",
    "然后用下面的等式边缘化$p$:\n",
    "\n",
    "$$P(B~|~D) \\equiv \\int_{-\\infty}^\\infty P(B,p~|~D) {\\mathrm d}p$$\n",
    "\n",
    "这个等式源自条件概率(conditional probability)和总概率(total probability)定义，源自概率率公理的基本推论，不容置疑。频率主义者也认同这点，即使他们可能不同意我们把$P(p)$解释成“我们认识的不确定性的度量”。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 建立贝叶斯表达式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "要计算结果，我们就要把上面的$P(B~|~D)$转换成可以计算的形式。\n",
    "\n",
    "我们用[条件概率(conditional probability)](http://en.wikipedia.org/wiki/Conditional_probability#Definition)来展开$P(B,p~|~D)$:\n",
    "\n",
    "$$P(B~|~D) = \\int P(B~|~p, D) P(p~|~D) dp$$\n",
    "\n",
    "然后再用 [贝叶斯定理(Bayes' rule)](http://en.wikipedia.org/wiki/Bayes%27_theorem)改写$P(p~|~D)$:\n",
    "\n",
    "$$P(B~|~D) = \\int P(B~|~p, D) \\frac{P(D~|~p)P(p)}{P(D)} dp$$\n",
    "\n",
    "最后，用前面同样的概率恒等式，可以将$P(D)$扩展成分式:\n",
    "\n",
    "$$P(B~|~D) = \\frac{\\int P(B~|~p,D) P(D~|~p) P(p) dp}{\\int P(D~|~p)P(p) dp}$$\n",
    "\n",
    "现在的公式就可以计算了，我解释一下：\n",
    "\n",
    "- $P(B~|~p,D)$: 就是上面使用的频率论的似然估计概率。也就是，已知标记位置为$p$且在Alice与Bob比分$5:3$的条件下，Bob获胜的概率？假如需要连续3次获胜，即 $P(B~|~p,D) = (1 - p) ^ 3$.\n",
    "- $P(D~|~p)$: 这也容易算。已知Alice那侧概率$p$, 8次中5次为Alice那侧的似然估计概率。答案来自著名的 [(二项分布)Binomial distribution](http://en.wikipedia.org/wiki/Binomial_distribution)：$P(D~|~p) \\propto p^5 (1-p)^3$\n",
    "- $P(p)$: 对概率$p$先验认知。此例中，我们假设$p$最终要么是0，要么是1。就是说，$P(p) \\propto 1$，积分范围介于0和1之间。\n",
    "\n",
    "把这些放在一起，如下所示：\n",
    "\n",
    "$$P(B~|~D) = \\frac{\\int_0^1 (1 - p)^6 p^5 dp}{\\int_0^1 (1 - p)^3 p^5 dp}$$\n",
    "\n",
    "其中，积分范围介于0和1之间。\n",
    "\n",
    "积分看着有点复杂，如果看出是[贝塔函数(Beta Function)](http://en.wikipedia.org/wiki/Beta_function)就好办了：\n",
    "\n",
    "$$\\beta(n, m) = \\int_0^1 (1 - p)^{n - 1} p^{m - 1}$$\n",
    "\n",
    "贝塔函数可以进一步表示成伽马函数(Gamma function)，如阶乘(factorials)，但是我们可以直接用Scipy的beta函数简化计算："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "P(B|D) = 0.09\n"
     ]
    }
   ],
   "source": [
    "from scipy.special import beta\n",
    "bayes_prob = beta(6 + 1, 5 + 1) / beta(3 + 1, 5 + 1)\n",
    "\n",
    "print(\"P(B|D) = {0:.2f}\".format(bayes_prob))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们改为赔率的方式显示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Bob获胜的贝叶斯赔率为: 10 to 1\n"
     ]
    }
   ],
   "source": [
    "print(\"Bob获胜的贝叶斯赔率为: {0:.0f} to 1\".format((1. - bayes_prob) / bayes_prob))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出贝叶斯的结果是10比1，而频率论方法是18比1。究竟哪个是对的呢？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 穷举/蒙特卡罗方法(Brute Force/Monte Carlo Approach)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于本例内容太简单，实际上很容易通过蒙特卡罗方法仿真来获得结果。通过穷举获得所有的可能：随机产生大量的结果，然后计算Bob最后获胜的比例。本例很多相关的随机变量都是均匀分布的，可以通过 ``numpy`` 包就可以搞定："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Sanity check passed)\n",
      "Number of suitable games: 111467\n",
      "Number of these games Bob won: 10079\n",
      "Monte Carlo Probability of Bob winning: 0.09\n",
      "MC Odds against Bob winning: 10 to 1\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "np.random.seed(0)\n",
    "\n",
    "# play 100000 games with randomly-drawn p, between 0 and 1\n",
    "# 玩1000万次游戏，p介于0到1之间\n",
    "p = np.random.random(1000000)\n",
    "\n",
    "# each game needs at most 11 rolls for one player to reach 6 wins\n",
    "# 每次游戏最多需要投掷11次保证一个玩家赢6次，\n",
    "# 最坏的情况是第10次5比5，那么第11次一定见分晓，\n",
    "# 就像乒乓球比赛中的11球6胜\n",
    "rolls = np.random.random((11, len(p)))\n",
    "\n",
    "# count the cumulative wins for Alice and Bob at each roll\n",
    "# 分别计算Alice和Bob赢的次数。\n",
    "Alice_count = np.cumsum(rolls < p, 0)\n",
    "Bob_count = np.cumsum(rolls >= p, 0)\n",
    "\n",
    "# sanity check: total number of wins should equal number of rolls\n",
    "# 合理性检验：总获胜次数应该等于投掷数\n",
    "total_wins = Alice_count + Bob_count\n",
    "assert np.all(total_wins.T == np.arange(1, 12))\n",
    "print(\"(Sanity check passed)\")\n",
    "\n",
    "# determine number of games which meet our criterion of (A wins, B wins)=(5, 3)\n",
    "# this means Bob's win count at eight rolls must equal 3\n",
    "# 确定符合初始条件是(5, 3)的游戏次数\n",
    "# 也就是说Bob在8次后获胜3次\n",
    "good_games = Bob_count[7] == 3\n",
    "print(\"Number of suitable games: {0}\".format(good_games.sum()))\n",
    "\n",
    "# truncate our results to consider only these games\n",
    "# 只考虑满足初始条件的游戏\n",
    "# Alice_count = Alice_count[:, good_games]\n",
    "Bob_count = Bob_count[:, good_games]\n",
    "\n",
    "# determine which of these games Bob won.\n",
    "# to win, he must reach six wins after 11 rolls.\n",
    "# 确定最终Bob获胜的的游戏次数\n",
    "# 也就是11次后获胜6次\n",
    "bob_won = np.sum(Bob_count[10] == 6)\n",
    "print(\"Number of these games Bob won: {0}\".format(bob_won.sum()))\n",
    "\n",
    "# compute the probability\n",
    "# 计算Bob获胜概率\n",
    "mc_prob = bob_won.sum() * 1. / good_games.sum()\n",
    "print(\"Monte Carlo Probability of Bob winning: {0:.2f}\".format(mc_prob))\n",
    "print(\"MC Odds against Bob winning: {0:.0f} to 1\".format((1. - mc_prob) / mc_prob))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "蒙特卡罗仿真和贝叶斯的结果都是10比1。表面上看，简单频率论方法挂了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 讨论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本例比较了冗余参数*p*的不同处理方式。蒙特卡罗仿真给了一个真实可能的穷举方法(假设之前的假设都靠谱)，表明贝叶斯的结果是对的。而频率论方法用一个最大似然估计值，看来是错了。\n",
    "\n",
    "随着我的评论和跟帖不断扩散，我在Reddit和Hacker News上被网友撕成了碎片，我的声明一点**并不是说频率主义是错的**。结果的错误源自“简单”而非“频率率”。当然，频率论中有一堆方法处理冗余参数——如通过数据变换和训练来消除对$p$的依赖——但是在此例中，如果不$p$用贝叶斯边缘概率法，我没找到其他任何方法。\n",
    "\n",
    "另外，本例对经典的频率论来说可能不太公平。频率论者可能希望用假设检验或置信区间(null tests or confidence intervals)给出结果：也就是设计一个方法来构建边界，类似实验中正确的结果为百分之$100\\times(1 - p)$，对某个$p$，如0.05(这里说的$p$和我们前面的$p$不一样)。\n",
    "\n",
    "这两条频率论观点有一个共同之处：都需要一定程度的努力和/或专业知识；可能一个靠谱的频率论方法对一个统计学博士是显而易见的，但是对一个普通人来说未必那么简单。总之，我认为贝叶斯主义是解决这类问题的良方：通过几条贝叶斯公理做简单的代数运算，就可以直接获得正确的结果。\n",
    "\n",
    "下面我们研究一个复杂点的例子。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 例 #2: 带奇点(Outliers)的线性拟合(Linear Fit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "冗余参数适合处理数据奇点。考虑下面的数据集合$x$和$y$，$e$是$y$的误差。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = np.array([ 0,  3,  9, 14, 15, 19, 20, 21, 30, 35,\n",
    "              40, 41, 42, 43, 54, 56, 67, 69, 72, 88])\n",
    "y = np.array([33, 68, 34, 34, 37, 71, 37, 44, 48, 49,\n",
    "              53, 49, 50, 48, 56, 60, 61, 63, 44, 71])\n",
    "e = np.array([ 3.6, 3.9, 2.6, 3.4, 3.8, 3.8, 2.2, 2.1, 2.3, 3.8,\n",
    "               2.2, 2.8, 3.9, 3.1, 3.4, 2.6, 3.4, 3.7, 2.0, 3.5])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们画个图："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff054217290>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.errorbar(x, y, e, fmt='.k', ecolor='gray');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们的任务是找数据的最佳拟合线。很明显，数据里面有一些奇点，但是让我们用一个不稳定(non-robust)最大似然估计方法开始。如前所述，下面的最大似然估计结果要么概率论要么贝叶斯(有均匀分布前提)：在这类问题里面，这些方法基本等价。\n",
    "\n",
    "我们先做一个简单的线性模型，有一个斜率和一个截距的参数矢量$\\theta$，定义如下：\n",
    "\n",
    "$$\\hat{y}(x~|~\\theta) = \\theta_0 + \\theta_1 x$$\n",
    "\n",
    "用这个模型，我们可以计算正态似然估计：\n",
    "\n",
    "$$p(x_i,y_i,e_i~|~\\theta) \\propto \\exp\\left[-\\frac{1}{2e_i^2}\\left(y_i - \\hat{y}(x_i~|~\\theta)\\right)^2\\right]$$\n",
    "\n",
    "总样本的似然估计是个体似然估计的乘积。两边取对数：\n",
    "\n",
    "$$\\log \\mathcal{L}(D~|~\\theta) = \\mathrm{const} - \\sum_i \\frac{1}{2e_i^2}\\left(y_i - \\hat{y}(x_i~|~\\theta)\\right)^2$$\n",
    "\n",
    "如果看过上一节的内容，会很明白。最终的式子是数据模型的对数似然估计(log-likelihood)，可以找到$\\theta$的最大似然估计模型的最大值。同理，我们也可以最小化总样本的似然估计，记作*(损失)loss*：\n",
    "\n",
    "$$\\mathrm{loss} = \\sum_i \\frac{1}{2e_i^2}\\left(y_i - \\hat{y}(x_i~|~\\theta)\\right)^2$$\n",
    "\n",
    "这个表达式就是*平方损失(squared loss)*；我们简单的演示了平方损失源自正态对数似然估计。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 标准似然估计法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "按照前面的逻辑，我们用频率论中求最大似然估计(或者最小损失)的方式来算$\\theta$。假设$\\theta$为扁平先验(flat prior)，贝叶斯的后验概率会产生相同结果。 (如果按照最大熵原则的最佳参数理论，此处均匀分布并非最佳选择；但我们忽略这些细节，因为对此例影响很小)。\n",
    "\n",
    "简单起见，我们用scipy的``optimize``包来获得最小损失(如果用矩阵方法，平方损失的计算会更困难，但是我们使数值最小化，就比较容易处理)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff03c058110>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy import optimize\n",
    "\n",
    "def squared_loss(theta, x=x, y=y, e=e):\n",
    "    dy = y - theta[0] - theta[1] * x\n",
    "    return np.sum(0.5 * (dy / e) ** 2)\n",
    "\n",
    "theta1 = optimize.fmin(squared_loss, [0, 0], disp=False)\n",
    "\n",
    "xfit = np.linspace(0, 100)\n",
    "plt.errorbar(x, y, e, fmt='.k', ecolor='gray')\n",
    "plt.plot(xfit, theta1[0] + theta1[1] * xfit, '-k')\n",
    "plt.title('Maximum Likelihood fit: Squared Loss');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由平方损失函数的本性，奇点对拟合线的影响不成比例。如果有一个奇点离拟合线有10个标准差的距离，那么它对损失函数的贡献比25个只有2个标准差远的奇点们重要。\n",
    "\n",
    "很明显，平方损失过度依赖奇点，对我们的拟合任何造成很大影响。频率论模式解决这个问题的手段就是通过调整平方损失函数，使它更稳定。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 奇点的频率论纠正方法：Huber损失(Huber Loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "损失函数的可能看起来有无限多种，但是相对靠谱的选择就是[Huber loss](http://en.wikipedia.org/wiki/Huber_loss_function)。Huber损失引入一个临界值(critical value)使得损失曲线从平方变为线性。让我们画个图来比较一下Huber损失和标准损失的临界值$c$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\niBvkP01eAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff022b7ddd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = np.linspace(-20, 20)\n",
    "\n",
    "def huber_loss(t, c=3):\n",
    "    return ((abs(t) < c) * 0.5 * t ** 2\n",
    "            + (abs(t) >= c) * -c * (0.5 * c - abs(t)))\n",
    "\n",
    "plt.plot(t, 0.5 * t ** 2, label=\"squared loss\", lw=2)\n",
    "for c in (10, 5, 3):\n",
    "    plt.plot(t, huber_loss(t, c), label=\"Huber loss, c={0}\".format(c), lw=2)\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('standard deviations')\n",
    "plt.legend(loc='best', frameon=False);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Huber损失对模型中拟合很好的点作用是等同于标准损失的，但是会降低奇点的影响。如一个20标准差的点标准损失200，但是c=3时的Huber损失只有55。我们来看看Huber损失的最佳拟合结果与标准损失做个对比(灰色线表示)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff03c08cd10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def total_huber_loss(theta, x=x, y=y, e=e, c=3):\n",
    "    return huber_loss((y - theta[0] - theta[1] * x) / e, c).sum()\n",
    "\n",
    "theta2 = optimize.fmin(total_huber_loss, [0, 0], disp=False)\n",
    "\n",
    "plt.errorbar(x, y, e, fmt='.k', ecolor='gray')\n",
    "plt.plot(xfit, theta1[0] + theta1[1] * xfit, color='lightgray')\n",
    "plt.plot(xfit, theta2[0] + theta2[1] * xfit, color='black')\n",
    "plt.title('Maximum Likelihood fit: Huber loss');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "直观的看，会觉得好像Huber损失拟合是我们要的结果。\n",
    "\n",
    "但一个贝叶斯主义者可能会说这种新的损失函数的动机有点可疑：如前所述，平方损失源自正态似然估计，但Huber损失看着有点*(随意)ad hoc*，这是哪儿来的? $c$到底用多少合适呢？对奇点使用线性的损失函数的动机有没有一个合理的解释呢？或者只是简单的把奇点删掉？这么多对模型的影响有多大？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 贝叶斯方法处理奇点：冗余参数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "贝叶斯方法处理奇点一般通过*调整模型(modifying the model)* ，这样奇点就被考虑到。很明显，线性函数对这个模型不是一个好结果。因此，让我们设计一个更复杂的模型来考虑奇点。一种方式就是把信号和噪声(background)混合在一起：\n",
    "\n",
    "$$\\begin{array}{ll}\n",
    "p(\\{x_i\\}, \\{y_i\\},\\{e_i\\}~|~\\theta,\\{g_i\\},\\sigma,\\sigma_b) = & \\frac{g_i}{\\sqrt{2\\pi e_i^2}}\\exp\\left[\\frac{-\\left(\\hat{y}(x_i~|~\\theta) - y_i\\right)^2}{2e_i^2}\\right] \\\\\n",
    "&+ \\frac{1 - g_i}{\\sqrt{2\\pi \\sigma_B^2}}\\exp\\left[\\frac{-\\left(\\hat{y}(x_i~|~\\theta) - y_i\\right)^2}{2\\sigma_B^2}\\right]\n",
    "\\end{array}$$\n",
    "\n",
    "我们要做的就是把模型加上冗余参数： $\\{g_i\\}$是一组权重介于0到1之间，表明每个点$i$拟合的程度。$g_i=0$表示奇点，标准差$\\sigma_B$的正态分布用来计算似然估计。$\\sigma_B$也是一个冗余参数， 它的值可以是一组足够大的数，比如50。\n",
    "\n",
    "现在我们的模型足够复杂了：有22个参数，但是大多数可作为冗余参数，最终将被边缘化(marginalized-out)。恰似之前我们在台球游戏里面边缘化$p$。让我们构建一个函数来实现似然估计。如上一节，我们使用[emcee](http://dan.iel.fm/emcee/current/) 包来探索参数空间。\n",
    "\n",
    "为了算出结果，我们用函数开始定义先验概率，似然估计和后验概率："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# theta will be an array of length 2 + N, where N is the number of points\n",
    "# theta[0] is the intercept, theta[1] is the slope,\n",
    "# and theta[2 + i] is the weight g_i\n",
    "# theta是长度2 + N的数组，其中N是点的数量\n",
    "# theta[0]是截距，theta[1]是斜率\n",
    "# theta[2 + i]是权重g_i\n",
    "\n",
    "def log_prior(theta):\n",
    "    #g_i needs to be between 0 and 1\n",
    "    if (all(theta[2:] > 0) and all(theta[2:] < 1)):\n",
    "        return 0\n",
    "    else:\n",
    "        return -np.inf  # recall log(0) = -inf\n",
    "\n",
    "def log_likelihood(theta, x, y, e, sigma_B):\n",
    "    dy = y - theta[0] - theta[1] * x\n",
    "    g = np.clip(theta[2:], 0, 1)  # g<0 or g>1 leads to NaNs in logarithm\n",
    "    logL1 = np.log(g) - 0.5 * np.log(2 * np.pi * e ** 2) - 0.5 * (dy / e) ** 2\n",
    "    logL2 = np.log(1 - g) - 0.5 * np.log(2 * np.pi * sigma_B ** 2) - 0.5 * (dy / sigma_B) ** 2\n",
    "    return np.sum(np.logaddexp(logL1, logL2))\n",
    "\n",
    "def log_posterior(theta, x, y, e, sigma_B):\n",
    "    return log_prior(theta) + log_likelihood(theta, x, y, e, sigma_B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我们运行MCMC样本来探索参数空间："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "-c:18: RuntimeWarning: divide by zero encountered in log\n",
      "-c:19: RuntimeWarning: divide by zero encountered in log\n"
     ]
    }
   ],
   "source": [
    "# Note that this step will take a few minutes to run!\n",
    "\n",
    "ndim = 2 + len(x)  # number of parameters in the model\n",
    "nwalkers = 50  # number of MCMC walkers\n",
    "nburn = 10000  # \"burn-in\" period to let chains stabilize\n",
    "nsteps = 15000  # number of MCMC steps to take\n",
    "\n",
    "# set theta near the maximum likelihood, with \n",
    "np.random.seed(0)\n",
    "starting_guesses = np.zeros((nwalkers, ndim))\n",
    "starting_guesses[:, :2] = np.random.normal(theta1, 1, (nwalkers, 2))\n",
    "starting_guesses[:, 2:] = np.random.normal(0.5, 0.1, (nwalkers, ndim - 2))\n",
    "\n",
    "import emcee\n",
    "sampler = emcee.EnsembleSampler(nwalkers, ndim, log_posterior, args=[x, y, e, 50])\n",
    "sampler.run_mcmc(starting_guesses, nsteps)\n",
    "\n",
    "sample = sampler.chain  # shape = (nwalkers, nsteps, ndim)\n",
    "sample = sampler.chain[:, nburn:, :].reshape(-1, ndim)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一旦有了这些样本，我们就可以获得马尔可夫链(Markov chains)的一个很好的属性。因为这些样本的分布模型是后验的，所以我们可以通过忽略它们来整合出(如，边缘化)冗余参数。\n",
    "\n",
    "我们通过样本的前两列来看斜率和截距的(边缘化)分布："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n2Vp5OJ1nHCwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff022b48cd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(sample[:, 0], sample[:, 1], ',k', alpha=0.1)\n",
    "plt.xlabel('intercept')\n",
    "plt.ylabel('slope');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见，斜率分布在$\\sim 0.45$附近，截距在$\\sim 31$附近。我们一会儿会把这个模型画出来，现在让我们看看还有没有其他信息。\n",
    "\n",
    "通过分析MCMC样本会发现，冗余参数的选择是完全对称的(completely symmetric)：就像我们可以把$\\{g_i\\}$做冗余参数，也可以用截距和斜率做冗余参数。让我们试试看，检查一下$g_1$和$g_2$的后验结果，奇点标在前两个点上："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "g1 mean: 0.64\n",
      "g2 mean: 0.41\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n/NedtWz3SOmLnxSRfyAi317+/d921bgdI6Uv/rOIfMfy83dIoRx+d0ft2yX+lYj898jvjeXm+6Yc\nfp+IfIv+/vbyu7pjXqJQTOkLxp+Tx5XBS0PquPhxEfkby7/f28SfDZHSF9ci8l0i8k5E/o2I/Jnd\nNG3nSOmLL4rIHxKR/ySFOeUv7qZp7x0ay833bXuVOqFtfsZLFARNnulHROSnpZpI+JKQ0hd/TQpa\nFpVifOwih+c5kNIXh1JE/N2IyO+RYof5JSnszS8JKX3xl6QwN/2wFDlS/0xE+iLyP5+uWe8tGsnN\n9005LESkS3935XFrHDrmu5ffvTSk9IVI4YT+ohQ+h9i28kNGSl98vzwmUV5IET79OyLyj568dbtF\nSl98SwpT0v9e/vuXUgjEl6YcUvriB0XkLy8/f1NE/oOI/AEpdlSvCR+83MwJc49I6YvvkcLm+tFO\nW7Z7pPQF42/Ly41WSumLPygFBc2+FDuHr4lIb3dN3BlS+uIXReTt8nNHCuXxXTtq367xSUlzSH+w\ncjMnzD2iri9+WQoH25eX/35j1w3cIVLGBfCSlYNIWl/8rBQRS18Tkb+w09btFnV9cSEFd9vHUvTF\nT+66gTvC35XCr/J/pNg5/rS8XrmZkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGR\nkZGRkZGRkZGRkZGRkZGRkfHS8VLJyTIydoFLKTJRvyUFh4+XrZ2RkZGR8crwD0Xk90qhJH7xmduS\nkbFVvG/1HDIyPhR8Uoqd9/+SorLWr0lRUOXyGduUkbE1ZOWQkbEevlMKwjcRkR8SkX8tRX3ibKrN\neBHIyiEjYz18TUT+rxS1qn9ACm78j5+1RRkZW8T7VuwnI+NDwYUUlefOReRHn7ktGRlbx/5zNyAj\n4wPFvRQmpB8VkS+IyImIfE6K4vVffcZ2ZWRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk\nZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGS8Mvx/fjb3DbrlW+IAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff03c042e50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(sample[:, 2], sample[:, 3], ',k', alpha=0.1)\n",
    "plt.xlabel('$g_1$')\n",
    "plt.ylabel('$g_2$')\n",
    "\n",
    "print(\"g1 mean: {0:.2f}\".format(sample[:, 2].mean()))\n",
    "print(\"g2 mean: {0:.2f}\".format(sample[:, 3].mean()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这两个参数不是很相关，但是我们可以看到$(g_1, g_2) = (1, 0)$是比较明显的： $g_1$的均值大于0.5，$g_2$的均值小于0.5。如果我们选择中间值$g=0.5$那么我们的算法会把$g_2$当中奇点。\n",
    "\n",
    "让我们来确认一下，画出原始数据的边缘化测试模型，奇点用红圈标识。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff03c08cad0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "theta3 = np.mean(sample[:, :2], 0)\n",
    "g = np.mean(sample[:, 2:], 0)\n",
    "outliers = (g < 0.5)\n",
    "\n",
    "plt.errorbar(x, y, e, fmt='.k', ecolor='gray')\n",
    "plt.plot(xfit, theta1[0] + theta1[1] * xfit, color='lightgray')\n",
    "plt.plot(xfit, theta2[0] + theta2[1] * xfit, color='lightgray')\n",
    "plt.plot(xfit, theta3[0] + theta3[1] * xfit, color='black')\n",
    "plt.plot(x[outliers], y[outliers], 'ro', ms=20, mfc='none', mec='red')\n",
    "plt.title('Maximum Likelihood fit: Bayesian Marginalization');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "看！上面黑线显示的结果更符合我们的直觉。而且，自动被识别的奇点也是我们可以手工识别出来的。为了比较，我把之前的方法用灰线标识：简单的最大似然估计和Huber损失的频率论方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 讨论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "今天，我们讨论线性回归(linear regression)中的奇点发现问题。一个经典的正态最大似然估计方法不能解决，但是在频率论中我们能够调整损失函数来纠正，在贝叶斯理论中通过引入一堆冗余参数的混合模型来调整。\n",
    "\n",
    "两种方法都有优缺点：频率论方法相对直接而且计算高效，但基于难以解释的损失函数。贝叶斯方法容易建立并能产生好的结果，但是要求一堆主观前提。在写代码和计算时间上耗费更多。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 最终结论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在上一篇中，我讨论了两种理论的差异，并且说明在简单问题下，忽略彼此差异，二者等价。在这一篇中，我们探讨了差异的一种：冗余参数处理。\n",
    "\n",
    "在贝叶斯台球的例子中，我们论述频率论方法不靠谱，而贝叶斯方法靠谱。这并非说频率主义是错的，但是告诉我们用它的时候得当心。\n",
    "\n",
    "在线性回归的例子中，我们论述了一种用频率主义和贝叶斯主义解决数据奇点问题的可行方法。用稳定的频率论损失函数相对的短平快，但是其动机混乱而难以解释。用贝叶斯混合模型更费力且需要大量计算，但是能够算出完美的结果，使多个问题被一次解决：也就是，边缘化一种方式找出最佳拟合模型，边缘化另种方式找出数据奇点。\n",
    "\n",
    "哪个更好呢？频率主义和贝叶斯主义。\n",
    "\n",
    "答案依赖于你对两者的掌握程度，也有赖于问题的复杂度，以及可用的计算资源。我，和很多物理背景的人一样，倾向于贝叶斯方法，因为它们能够从任何基本原理派生出我想要的结果。贝叶斯主义，基于一些概率公理的代数计算，我们可以构建非常复杂的方法来解决一大堆问题。就如质-能转换可以用到任何场合，从抛物运动(projectile motion)到恒星结构(stellar structure)，贝叶斯原理和贝叶斯概率解释能用来解决几乎任何统计问题：从计算赌博赔率(gambling odds)到探索噪声数据中的外星信息(exoplanet transits in noisy photometric data)。在贝叶斯模式中，你不需要花大量时间来记忆和理解频率论技巧和术语(p值，假设检验，置信区间，断点等等)，就为了解决一个小问题。我认为这是一种误解：人们总觉得贝叶斯很难。相反，很多科学家觉得它更容易。\n",
    "\n",
    "简单和优美之外，我坚定贝叶斯主义立场的深层理由是必须比较科学研究中频率论置信区间(confidence intervals)和贝叶斯可信区域(credibility regions)。这篇已经够长了，我打算下一篇(http://jakevdp.github.io/blog/2014/06/12/frequentism-and-bayesianism-3-confidence-credibility/)来讨论。(有费马之嫌~~)\n",
    "\n",
    "<small>\n",
    "这篇博客是IPython notebook写的。可以[下载](http://jakevdp.github.io/downloads/notebooks/FreqBayes2.ipynb)，或者看[nbviewer](http://nbviewer.ipython.org/url/jakevdp.github.io/downloads/notebooks/FreqBayes2.ipynb)静态网页。\n",
    "</small>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
